package com.mima.minaserver.client;


import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.service.IoConnector;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.transport.socket.nio.NioDatagramConnector;

import com.mima.minaserver.server.ByteArrayCodecFactory;
import com.mima.minaserver.server.IOTServerHandler;

public class Client extends IoHandlerAdapter {
	private IoConnector connector;
	private static IoSession session;
	@Override
	public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
		// TODO Auto-generated method stub
		cause.printStackTrace();
	}
	
	public static byte[] HexStringtoBytes(String str) {
		if (str == null || str.trim().equals("")) {
			return new byte[0];
		}

		byte[] bytes = new byte[str.length() / 2];
		for (int i = 0; i < str.length() / 2; i++) {
			String subStr = str.substring(i * 2, i * 2 + 2);
			bytes[i] = (byte) Integer.parseInt(subStr, 16);
		}

		return bytes;
	}

	
	public static void main(String[] args) {

		try {
			new Client();
//			for(int i=0;i<10;i++) {
//				new Client();
				byte[] heartp = "HEARTP".getBytes();
				byte[] uuid = "f8a538c62d93473ebf6944eb7d7b9513".getBytes();
				byte[] dateTime = HexStringtoBytes("5ad605d4");
				byte[] key_id = IOTServerHandler.intToBytes(19);
				byte[] userpasswd = "O5811Y,M6643l".getBytes();
				//byte[] returnBytes = new byte[heartp.length+uuid.length+dateTime.length+dateTime.length+userpasswd.length];
				byte[] returnBytes = new byte[heartp.length+uuid.length+dateTime.length+dateTime.length+key_id.length+userpasswd.length];
				System.arraycopy(heartp, 0, returnBytes, 0, 6);
				System.arraycopy(uuid, 0, returnBytes, 6, 32);
				System.arraycopy(dateTime, 0, returnBytes, 38, dateTime.length);
				System.arraycopy(key_id, 0, returnBytes, 46, key_id.length);
				System.arraycopy(userpasswd, 0, returnBytes, 47, userpasswd.length);
				
//				byte[] heartp = "RTPURL".getBytes();
//				byte[] uuid = "2b4140dbc66f4ec7bfe4a42e82aa57cc".getBytes();
//				byte[] RTMP_URL = "rtmp:192.168.0.1:8080/device2".getBytes();
//				byte[] returnBytes = new byte[heartp.length+uuid.length+RTMP_URL.length];
//				System.arraycopy(heartp, 0, returnBytes, 0, 6);
//				System.arraycopy(uuid, 0, returnBytes, 6, 32);
//				System.arraycopy(RTMP_URL, 0, returnBytes, 38, RTMP_URL.length);
//				System.out.println(returnBytes.length);
				session.write(IoBuffer.wrap(returnBytes));
				//Thread.sleep(2000);			
			//}
			}catch (Exception e) {
			e.printStackTrace();
		}
	
	}
	public Client() throws UnknownHostException {
		connector = new NioDatagramConnector();
		connector.setHandler(new Clienthandler());
		connector.getFilterChain().addLast("codec",   
	                new ProtocolCodecFilter(  
	                        new ByteArrayCodecFactory())); 
		//ConnectFuture connFuture = connector.connect(new InetSocketAddress("47.92.28.251", 8989));
		ConnectFuture connFuture = connector.connect(new InetSocketAddress("127.0.0.1", 8989));
		connFuture.awaitUninterruptibly();
		session = connFuture.getSession();
		System.out.println("UDP 客户端启动");

	}

	/**
	 * post请求传输map数据
	 * 
	 * @param url
	 * @param map
	 * @param encoding
	 * @return
	 * @throws ClientProtocolException
	 * @throws IOException
	 */
	public static String sendPostDataByMap(String url, Map<String, String> map, String encoding)
			throws ClientProtocolException, IOException {
		String result = "";

		// 创建httpclient对象
		CloseableHttpClient httpClient = HttpClients.createDefault();
		// 创建post方式请求对象
		HttpPost httpPost = new HttpPost(url);

		// 装填参数
		List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
		if (map != null) {
			for (Entry<String, String> entry : map.entrySet()) {
				nameValuePairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
			}
		}

		// 设置参数到请求对象中
		httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, encoding));

		// 设置header信息
		// 指定报文头【Content-type】、【User-Agent】
		httpPost.setHeader("Content-type", "application/x-www-form-urlencoded");
		httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");

		// 执行请求操作，并拿到结果（同步阻塞）
		CloseableHttpResponse response = httpClient.execute(httpPost);
		// 获取结果实体
		// 判断网络连接状态码是否正常(0--200都数正常)
		if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
			result = EntityUtils.toString(response.getEntity(), "utf-8");
		}
		// 释放链接
		response.close();

		return result;
	}

	/**
	 * post请求传输json数据
	 * 
	 * @param url
	 * @param json
	 * @param encoding
	 * @return
	 * @throws ClientProtocolException
	 * @throws IOException
	 */
	public static String sendPostDataByJson(String url, String json, String encoding)
			throws ClientProtocolException, IOException {
		String result = "";

		// 创建httpclient对象
		CloseableHttpClient httpClient = HttpClients.createDefault();

		// 创建post方式请求对象
		HttpPost httpPost = new HttpPost(url);

		// 设置参数到请求对象中
		StringEntity stringEntity = new StringEntity(json, ContentType.APPLICATION_JSON);
		stringEntity.setContentEncoding("utf-8");
		httpPost.setEntity(stringEntity);

		// 执行请求操作，并拿到结果（同步阻塞）
		CloseableHttpResponse response = httpClient.execute(httpPost);

		// 获取结果实体
		// 判断网络连接状态码是否正常(0--200都数正常)
		if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
			result = EntityUtils.toString(response.getEntity(), "utf-8");
		}
		// 释放链接
		response.close();

		return result;
	}

	/**
	 * get请求传输数据
	 * 
	 * @param url
	 * @param encoding
	 * @return
	 * @throws ClientProtocolException
	 * @throws IOException
	 */
	public String sendGetData(String url, String encoding) throws ClientProtocolException, IOException {
		String result = "";

		// 创建httpclient对象
		CloseableHttpClient httpClient = HttpClients.createDefault();

		// 创建get方式请求对象
		HttpGet httpGet = new HttpGet(url);
		httpGet.addHeader("Content-type", "application/json");
		// 通过请求对象获取响应对象
		CloseableHttpResponse response = httpClient.execute(httpGet);

		// 获取结果实体
		// 判断网络连接状态码是否正常(0--200都数正常)
		if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
			result = EntityUtils.toString(response.getEntity(), "utf-8");
		}
		// 释放链接
		response.close();

		return result;
	}
}
